Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Ciao a tutti, ho questo dilemma. Ho un'immagine molto grande (più della risoluzione del monitor) e vorrei fare in modo che utilizzando le frecce direzionali riesca a vedere le varie parti dell'immagine. Ho provato sia ad utilizzare la proprietà location che la proprietà top/left della picturebox e, sebbene l'immagine venga spostata correttamente in entrambi i casi, con mio dispiacere ho constatato che purtroppo è tagliata alla risoluzione impostata, quindi in pratica, spostando l'immagine in alto, in basso vedo il colore di background grigio invece del resto dell'immagine. Come faccio a creare una cosa del genere? Grazie.
Ho provato a inserire la picturebox in un panel e ad attivare l'autoscroll. L'effetto è esattamente quello che vorrei, purtroppo ho scoperto che non è possibile nascondere le barre dello scrolling (cosa veramente inspiegabile) e quindi sto da capo a dodici. In vb6 tra l'altro ho trovato un codice che fa proprio quello che voglio (l'ho anche provato e funziona) ma la mia maledetta niubbagine fa si che non riesca a portarlo in vb.net, nel quale molti metodi non esistono più. Il codice è questo:
''Option Explicit
'Private mPic As Picture
'Private mPicWidth As Single
'Private mPicHeight As Single
'Private mCurrentX As Single
'Private mCurrentY As Single
'Private mLeft As Single
'Private mTop As Single
'Private Sub Form_Load()
' mPic = LoadPicture("E:\Down\Tiger.bmp") 'TO DO: Add path to YOUR Picture file here
'Private Sub Picture1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
' If Button = 0 Then
' mCurrentX = X
' mCurrentY = Y
' ElseIf Button = vbLeftButton Then
' ShowPictureAtPosition(X + mLeft - mCurrentX, Y + mTop - mCurrentY)
' End If
'End Sub
'Private Sub ShowPictureAtPosition(ByVal pX As Single, ByVal pY As Single)
' With Picture1
' .Cls()
' .PaintPicture(mPic, pX, pY, mPicWidth, mPicHeight)
' End With
'End Sub
'Private Sub Picture1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
' mLeft = X + mLeft - mCurrentX : mTop = Y + mTop - mCurrentY
'End Sub
Ti conviene usare la classe graphics, ogni volta che vuoi cambiare immagine usa il metodo drawimage, se necessario puoi fornire coordinate negative, per usare questa classe leggi la guida di totem che è ben fatta!
http://totemslair.org/guide/viewchapter.php?guida=vb&id=96
Non credo di averci capito molto, comunque praticamente collego un'immagine con un oggetto graphics e tutte le operazioni eseguite su quest'oggetto vengono fatte sull'immagine giusto? Ma comunque poi l'immagine va inserita in una picturebox? Comunque sia ho provato con il metodo drawimage cercando di fargli disegnare la mia immagine da una certa posizione ma, nonostante il codice non generi errori, la posizione non cambia. Il codice che ho usato è questo:
Dim myImage As New Bitmap(filename:="c:\prova.jpg")
Dim G As Graphics
G = Graphics.FromImage(myImage)
g.drawimage(myimage, new Point(500,500))
Dopo quell'istruzione eseguo flush e metto tutto dentro una picturebox, giusto?:
g.flush()
picturebox1.image = myimage
L'immagine viene visualizzata ma senza che sia stata spostata, come se quello che ho fatto in drawimage non ci fosse.
Ultima modifica effettuata da ashgan il 04/08/2011 alle 12:41
Esattamente come dici: tutte le modifiche apportate all'oggetto graphics modificano l'immagine, prima di ridisegnare l'immagine devi cancellare ciò che c'è prima, usa il metodo clear e passagli come parametro un colore di sfondo:
Dim G as graphics = graphics.fromimage(immagine)
G.clear(systemcolors.control)
...
G.flush
Picturebox.image = immagine
Buongiorno, ho un problema, pure io vorrei muovere con il mouse un immagine grande all'interno della picturebox, fin qua tutto facile ma se uso il comando g.clear(colore) mi sparisce tutto e non viene ridisegnata mentre senza il comando g.clear(colore) quando sposto il mouse viene tutto sporcato e sormontato e con un movimento schifoso e scattoso ecco il mio codice simile a ashgan.
Imports VB = Microsoft.VisualBasic
Imports System.Drawing.Drawing2D
Imports System.Drawing.Printing
Imports System.Drawing.Imaging
Public Class Form1
Dim MyImage As Bitmap
Dim G As Graphics
Dim P, P2 As Point
Dim Drawing As Boolean
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MyImage = New Bitmap(My.Resources.Tavolo)
G = Graphics.FromImage(MyImage)
G.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
P2.X = 0 - MyImage.Width + (PictureBox1.Width)
P2.Y = 0 - MyImage.Height + (PictureBox1.Height)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'carico immagine nella posizione che desidero
G.DrawImage(MyImage, New Point(P2))
G.Flush()
PictureBox1.Image = MyImage
End Sub
Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
P.X = e.X - P2.X
P.Y = e.Y - P2.Y
Drawing = True
End Sub
Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
If Not Drawing Then Exit Sub
If P.X = e.X Then Exit Sub
P2.X = e.X - P.X
P2.Y = e.Y - P.Y
G.Clear(PictureBox1.BackColor)
G.DrawImage(MyImage, New Point(P2))
G.Flush()
PictureBox1.Image = MyImage
End Sub
Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
Drawing = False
End Sub
End Class
ecco, niente errori ma non ci vengo a capo con quel g.clear(colore)
ho letto pure la guida di totem molto chiara.....
Aiuto!!!!!
Grazie!
Ultima modifica effettuata da remeto il 19/09/2011 alle 6:12
Devi creare 2 immagini in una ci va l'immagine intera, nell'altra solo il pezzo da mostrare nella picturebox, graphics "deve disegnare" su quest'ultima usando il metodo drawimage e passandogli come parametri l'immagine intera e un punto. L'evento click è inutile rintracciarlo se non ti serve per funzioni particolari.
A occhio l'errore che hai fatto tu è stato usare la stessa immagine questo siglifica che se la sposti ne perdi un pezzo e non lo recuperi se la muovi al contrario.
WholeImagePosition =New Point(0,0)'posizione di partenza dell'immagine
G.DrawImage(WholeImage, WholeImagePosition)
G.Flush()
PictureBox1.Image= PbxImage
PictureBox1.Refresh()
EndSub
PrivateSub PictureBox1_MouseDown(ByVal sender AsObject, ByVal e As System.Windows.Forms.MouseEventArgs)Handles PictureBox1.MouseDown
If e.Button= Button.LeftThen'verifica che sia stato premuto il pulsante destro
P = e.Location
EndIf
EndSub
PrivateSub PictureBox1_MouseMove(ByVal sender AsObject, ByVal e As System.Windows.Forms.MouseEventArgs)Handles PictureBox1.MouseMove
IfNot e.Button= Button.LeftThen
ExitSub
EndIf
G.Clear(Systemcolors.Control)'viene cancellata l'immagine per evitare effetti trascinamento
G.DrawImage(WholeImage, New Point(P.X- exX + WholeImagePosition.X, P.Y- e.Y+ WholeImagePosition.Y))
G.Flush()'P è il punto dove abbiamo fatto click, e è il punto dove si trova ora il mouse, la rispettiva differenza delle coordinate indica di quanto si è mosso il mouse e aggiungendo questi valori alle coordinate dell'immagine quest'ultima si muoverà insieme al mouse.
PictureBox1.Image= PbxImage
PictureBox1.Refresh()
EndSub
PrivateSub PictureBox1_MouseUp(ByVal sender AsObject, ByVal e As System.Windows.Forms.MouseEventArgs)Handles PictureBox1.MouseUp
P =New Point(0,0)
'viene azzerato p, questo psassaggio non è fondamentale, ma serve se altre funzioni usano il valore di p.
EndSub
EndClass
Ultima modifica effettuata da Ale96 il 20/09/2011 alle 18:49